package ApplicationUtils;

##########################
#     OmnibusProxy       #
#    Krzysztof Ulman     #
# Politechnika Krakowska #
#      Kraków 2012       #
##########################

use strict;
use warnings;
use encoding 'utf8';

use Try::Tiny;

use Database;
use Screen;

our $database;

our $STATE_SHUTTING_DOWN = 'SHUTTING_DOWN';
our $STATE_WORKING_YES = 'YES';
our $STATE_WORKING_NO = 'NO';

#sprawdza czy nie nalezy przerwac pracy programu poprzez sprawdzenie flagi na bazie
sub isStopWorkSignal {
	try {
		my $db = private_getDb();
		my $value = $db->selectCrawlerIsWorking();
		if($value eq $STATE_SHUTTING_DOWN) {
			return 1;
		} elsif($value eq 'YES' || $value eq 'NO') {
			return 0;
		} else {
			die('Niepoprawna wartosc: ' . $value);
		}
	} catch {
		my $e = $_;
		Screen->printAndLogError($e);
		return 0;
	};
}

sub isAnyInstanceWorking {
	try {
		my $db = private_getDb();
		my $value = $db->selectCrawlerIsWorking();
		if($value eq $STATE_WORKING_YES || $value eq $STATE_SHUTTING_DOWN) {
			return 1;
		} elsif($value eq $STATE_WORKING_NO) {
			return 0;
		} else {
			die('Niepoprawna wartosc: ' . $value);
		}
	} catch {
		my $e = $_;
		Screen->printAndLogError($e);
		return 1;
	};
}

#sygnalizacja uruchomienia aplikacji
sub setStateStart {
	my $self = shift;
	private_setState($self, $STATE_WORKING_YES);
}

#sygnalizacja zatrzymania aplikacji
sub setStateStop {
	my $self = shift;
	private_setState($self, $STATE_WORKING_NO);
}

#aktuazlizacja stanu
sub private_setState {
	my $self = shift;
	my $state = shift;
	try {
		my $db = private_getDb();
		$db->updateApplicationState($state);
	} catch {
		my $e = $_;
		Screen->printAndLogError('Blad podczas aktualizacji stanu: ' . $e);
	};
}

#zwraca obiekt bazy danych
sub private_getDb {
	if(!$database) {
		$database = Database->new();	
	}
	return $database;
}

1;